package com.ww.exercise.coroutine

import kotlinx.coroutines.*
import java.util.concurrent.TimeUnit

fun main() = runBlocking {
    parentTask()
}

/**
 * 结构化并发（父子任务联动）
 * Java中，父任务取消后，子线程很难自动取消（需要手动传AtomicBoolean标志位），而协程的coroutineScope天然支持
 */
suspend fun parentTask() = coroutineScope {
    // 启动3个子任务
    launch {
        task1()
        // 即使子任务在挂载点，也被取消掉了
//        delay(200)
        // 再试下，子任务一直在有效执行
        while (true) {
            TimeUnit.SECONDS.sleep(1L)
            println("task1, 我一直在执行中...")
            yield()
        }
    }
    launch {
        task2()
        delay(300)
    }
    val task3 = async { task3() }

    // 模拟父任务出错
    if (task3.await() == "error") {
        throw RuntimeException("父任务失败")
    }
}

fun task1() {
    println("${Thread.currentThread()}在执行task1")
}

fun task2() {
    println("${Thread.currentThread()}在执行task2")
}

fun task3(): String {
    println("${Thread.currentThread()}在执行task3")
    return "error"
}